package java核心及工具类.Format类;

/*
【FieldPosition】
FieldPosition是由Format及其子类使用的简单类，用于标识格式化输出中的字段。可以通过两种方式识别字段：
	1.一个整数常数，其名称通常以_FIELD 。 的常量在的不同子类中定义的Format。
	2.由Format.Field常数，见ERA_FIELD及其朋友在DateFormat为例。
FieldPosition使用两个索引来跟踪格式化输出中的字段的位置：字段的第一个字符的索引和字段的最后一个字符的索引。

各种Format类中的format方法的一个版本需要一个FieldPosition对象作为参数。 您可以使用此format方法执行部分格式化或获取有关格式化输出的信息（例如字段的位置）。

如果您对格式化字符串中所有属性的位置感兴趣，请使用Format方法formatToCharacterIterator 。
【构造方法】
	1.FieldPosition(Format.Field attribute)    为给定的字段常量创建一个FieldPosition对象。
		为给定的字段常量创建一个FieldPosition对象。字段由各种Format子类中定义的Format标识。这相当于调用new FieldPosition(attribute,-1)。
		参数：attribute - Format.Field常数标识字段
	2.FieldPosition(Format.Field attribute, int fieldID)   为给定字段创建一个 FieldPosition对象。
		为给定字段创建一个FieldPosition对象。 该字段由Field子类之一的Field常量以及由Format子类定义的整数字段ID标识。 Format知道Field应该优先于attribute，
		如果attribute不为null，则忽略fieldID。但是，较旧的Format子类可能不知道Field并依赖于fieldID 。如果该字段没有相应的整数常数，fieldID应为-1。
		参数: attribute - Format.Field常量标识字段
			 fieldID - 标识字段的整数常量
	3.FieldPosition(int field)   为给定字段创建一个FieldPosition对象。
		为给定字段创建一个FieldPosition对象。 字段由常量来标识，其名称通常以_FIELD结尾，格式的各种子类中。
		参数：field - 字段标识符：常见NumberFormat.INTEGER_FIELD，NumberFormat.FRACTION_FIELD，DateFormat.YEAR_FIELD，DateFormat.MONTH_FIELD
【方法摘要】
所有方法接口方法具体的方法
	1.boolean equals(Object obj)  覆盖等于  重写：equals在 Object， 参数：obj - 与之比较的参考对象。
	2.int getBeginIndex()  检索请求字段中第一个字符的索引。结果:开始索引
	3.int getEndIndex()  检索请求字段中最后一个字符后的字符索引。结果:最终索引
	4.int getField()  检索字段标识符。结果:字段标识符
	5.Format.Field getFieldAttribute()   从 Field子类之一返回字段标识符作为属性常量。
		从Field子类之一返回字段标识符作为属性常量。如果字段仅由整数字段ID指定，则可能返回null。
		结果:字段的标识符
	6.int hashCode()   返回此FieldPosition的哈希码。 重写：hashCode在 Object
	7.void setBeginIndex(int bi)   设置开始索引。 
	8.void setEndIndex(int ei)   设置结束索引。
	9.String toString()   返回此FieldPosition的字符串表示形式。 重写：toString在 Object
		返回：return getClass().getName() +
            "[field=" + field + 
            ",attribute=" + attribute +
            ",beginIndex=" + beginIndex +
            ",endIndex=" + endIndex + ']';

*/
/*
import java.text.*;
import java.util.*;
public class FieldPosition类 {
	public static void main(String[] args) throws Exception,Throwable{
		//FieldPosition
		FieldPosition fp1 = new FieldPosition(0);
		FieldPosition fp2 = new FieldPosition(0);
		System.out.println(fp1.equals(fp1));	
		System.out.println(fp1.equals(fp2)); 
		System.out.println(fp1.getBeginIndex());
		System.out.println(fp2.getBeginIndex());
		System.out.println(fp1.getEndIndex());
		System.out.println(fp1.getField());
		System.out.println(fp1.getFieldAttribute());
		System.out.println(fp1.hashCode());
		System.out.println("--------");
		FieldPosition fp3 = new FieldPosition(4);//HOUR_OF_DAY1_FIELD
		System.out.println(fp3.hashCode());
		System.out.println(fp1.getBeginIndex());
		fp1.setBeginIndex(10);
		System.out.println(fp1.getBeginIndex());
		System.out.println(fp1.getEndIndex());
		fp1.setEndIndex(10);
		System.out.println(fp1.getEndIndex());
		System.out.println(fp1.toString());
		
		try { 
			//toString()方法的示例：
            // Creating and initializing new FieldPosition Object 
            FieldPosition pos1 = new FieldPosition(MessageFormat.Field.ARGUMENT); 
            FieldPosition pos2 = new FieldPosition(DateFormat.Field.AM_PM); 
            // getting the String representation of this FieldPosition Object using toString() method 
            String str1 = pos1.toString(); 
            String str2 = pos2.toString(); 
            System.out.println("----------------------------------");
            // display result 
            System.out.println("FieldPosition:- " + str1);
            //FieldPosition:- java.text.FieldPosition[field=-1,attribute=java.text.MessageFormat$Field(message argument field),beginIndex=0,endIndex=0] 
            System.out.println("FieldPosition:- " + str2);
            //FieldPosition:- java.text.FieldPosition[field=-1,attribute=java.text.DateFormat$Field(am pm),beginIndex=0,endIndex=0]
            
            //getField()方法的示例
            FieldPosition pos  = new FieldPosition(DateFormat.Field.AM_PM); 
            // getting Field attribute of FieldPosition object using getField() mehtod 
            int i = pos.getField(); 
            // display result 
            System.out.println("field attribute:- "+ Integer.toString(i));//field attribute:- -1
        } catch (ClassCastException e) { 
            System.out.println("Exception thrown:" + e); 
        }
		
		
		//
	    DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);  
	    StringBuffer dest3 = new StringBuffer();  

	    //关注的是几号  
//	    FieldPosition pos = new FieldPosition(DateFormat.DATE_FIELD);//DateFormat int DATE_FIELD=3
	    FieldPosition pos = new FieldPosition(3); 
	    //class NumberFormat INTEGER_FIELD = 0
	    //class DateFormat EAR_FIELD=0     
	    //                 FULL=0
	    //class Calendar   ALL_STYLES=0
	    //                 AM=0
	    //                 EAR=0
	    //                 JANUARY=0
	    System.out.println("=================================================");  

	    dest3 = df.format(new Date(), dest3, pos);  
	    System.out.println("dest3 = " + dest3);  
	    //结果当前时间为2012年6月27日 下午04时06分56秒  则beginIndex为7 endIndex为9  
	    System.out.println("FRACTION portion is at: " + pos.getBeginIndex() + ", " + pos.getEndIndex());  

	    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");  
	    String input[] = { "abc 2013-10-01 Vancouver, B.C.", "1248-03-01 Ottawa, ON", "1323-06-06 Toronto, ON" };  
	    for (int i = 0; i < input.length; i++) {  
	        ParsePosition pp = new ParsePosition(4);//从第四位开始处理  
	        Date d = formatter.parse(input[i], pp);  
	        if (d == null) {  
	            //结果只处理了"abc 2013-10-01 Vancouver, B.C."   
	            //"1248-03-01 Ottawa, ON"从第四位开始是"8-03-01 Ottawa, ON"无法转换  
	            System.err.println("Invalid date in " + input[i]);  
	            continue;  
	        }  
	        //成功转换后ParsePosition.getIndex()就是匹配的字符串结尾的索引  
	        String location = input[i].substring(pp.getIndex());  
	        System.out.println(" on " + d + " in " + location);  
	    }  
	  	
	}
}
*/
/*
【java.text.FieldPosition类的getFieldAttribute()】
FieldPosition构造方法：
1.public FieldPosition(int field) 为给定字段创建一个FieldPosition对象。 字段由常量来标识，其名称通常以_FIELD结尾，格式的各种子类中。
参数：field - 字段标识符
另请参见：NumberFormat.INTEGER_FIELD ， NumberFormat.FRACTION_FIELD ， DateFormat.YEAR_FIELD ， DateFormat.MONTH_FIELD

2.public FieldPosition(Format.Field attribute) 为给定的字段常量创建一个FieldPosition对象。 字段由各种Format子类中定义的Format标识。 
															  这相当于调用new FieldPosition(attribute, -1) 。
参数：attribute - Format.Field常数标识字段

3.public FieldPosition(Format.Field attribute,int fieldID)
	为给定字段创建一个FieldPosition对象。 该字段由Field子类之一的Field常量以及由Format子类定义的整数字段ID标识。 Format知道Field应该优先
	于attribute ，如果attribute不为null，则忽略fieldID 。 但是，较旧的Format子类可能不知道Field并依赖于fieldID 。 如果该字段没有相应的
	整数常数， fieldID应为-1。
参数：attribute - Format.Field常量标识字段

fieldID - 标识字段的整数常量
方法用于获取Format.field形式的字段标识符。用法: public Format.Field getFieldAttribute()
参数：此方法不接受任何参数作为参数。
返回值：此方法以Format.field的形式返回字段标识符。

下面是说明getFieldAttribute()方法的示例：
字段标识符有两种：
1.字段字符常量标识符，通过getFieldAttribute()获取
2.字段整数常量标识符，通过getField()
 如果该字段没有相应的整数常量标识符， fieldID应为-1。
 如果该字段没有相应的字符常量标识符， fieldID应为null。

范例1：*/
import java.text.*;
import java.util.*;
import java.io.*;

public class FieldPosition类 {
	public static void main(String[] argv) {
		try {
			// Creating and initializing new FieldPosition Object
			//final Field ARGUMENT = new Field("message argument field");
			//   Format.MessageFormat.Field的static finalf方法：ARGUMENT返回类型为Field
			FieldPosition pos = new FieldPosition(MessageFormat.Field.ARGUMENT,-1);

			// getting Field attribute of FieldPosition object using getField() mehtod
			Format.Field i = pos.getFieldAttribute();
			int id = pos.getField();

			// display result
			System.out.println("field identifier.:- " + i);// field identifier.:- java.text.MessageFormat$Field(message argument field)
			System.out.println("fieldId: " + id);//fieldId: -1,表明该字段没有相应的整数常数标识符
			FieldPosition pos1 = new FieldPosition(NumberFormat.Field.INTEGER,NumberFormat.INTEGER_FIELD);
			FieldPosition pos2 = new FieldPosition(NumberFormat.Field.FRACTION,NumberFormat.FRACTION_FIELD);
			FieldPosition pos3 = new FieldPosition(DateFormat.Field.YEAR,DateFormat.YEAR_FIELD);
			FieldPosition pos4 = new FieldPosition(DateFormat.Field.MONTH,DateFormat.MONTH_FIELD);
			//java.text.NumberFormat$Field(integer) 0
			System.out.println(pos1.getFieldAttribute()+" "+pos1.getField());
			//java.text.NumberFormat$Field(fraction) 1
			System.out.println(pos2.getFieldAttribute()+" "+pos2.getField());
			//java.text.DateFormat$Field(year) 1
			System.out.println(pos3.getFieldAttribute()+" "+pos3.getField());
			//java.text.DateFormat$Field(month) 2
			System.out.println(pos4.getFieldAttribute()+" "+pos4.getField());
			
			FieldPosition pos5 = new FieldPosition(NumberFormat.INTEGER_FIELD);
			FieldPosition pos6 = new FieldPosition(NumberFormat.Field.INTEGER);
			System.out.println(pos5.getFieldAttribute()+" "+pos5.getField());//null 0
			System.out.println(pos6.getFieldAttribute()+" "+pos6.getField());//java.text.NumberFormat$Field(integer) -1

			FieldPosition pos7 =new FieldPosition(DateFormat.Field.AM_PM);
			FieldPosition pos8 =new FieldPosition(DateFormat.AM_PM_FIELD);
			FieldPosition pos9 =new FieldPosition(DateFormat.Field.AM_PM,DateFormat.AM_PM_FIELD);
			System.out.println(pos7.getFieldAttribute()+" "+pos7.getField());//java.text.DateFormat$Field(am pm) -1
			System.out.println(pos8.getFieldAttribute()+" "+pos8.getField());//null 14
			System.out.println(pos9.getFieldAttribute()+" "+pos9.getField());//java.text.DateFormat$Field(am pm) 14
		} catch (ClassCastException e) {
			System.out.println("Exception thrown:" + e);
		}
	}
}

